Skipgram ======== 从输入语句中生成skip-gram。skip-gram是从句子中提取的词语序列,其中相邻词语之间的距离(跳过的词语数量)不超过指定的最大值。此算子主要用于自然语言处理(NLP)任务。 输入: - **sentence** - `StringPack*` 类型,指向输入语句的指针。 - **words** - `StringPack*` 类型,用于存储从语句中解析出的词语的工作空间。 - **ngram_size** - `int` 类型,指定每个n-gram中的词语数量。 - **max_skip_size** - `int` 类型,指定在构成n-gram时可以跳过的最大词语数量。 - **include_all_ngrams** - `int` 类型,布尔标志。如果为非零,则生成长度从1到 `ngram_size` 的所有n-gram;否则,仅生成长度为 `ngram_size` 的n-gram。 - **grams** - `StringPack**` 类型,用于存储生成的gram的工作空间。 - **grams_word_count** - `int*` 类型,用于存储每个gram中词语数量的工作空间。 - **stack** - `int*` 类型,长度为 `ngram_size` 的临时工作空间。 - **blank** - `char*` 类型,指向空格字符的指针,用于连接gram中的词语。 - **output_tensor** - `char*` 类型,最终输出张量的数据地址。 - **offset** - `int*` 类型,输出参数,用于存储 `output_tensor` 中每个gram的偏移量。 - **len** - `int*` 类型,输出参数,用于存储 `output_tensor` 中每个gram的长度。 - **shape** - `int*` 类型,输出参数,用于存储输出张量的维度信息。 - **core_mask** - (仅限共享版本) 核掩码。 输出: - **output_tensor**、**offset**、**len** 和 **shape** - 这些指针指向的内存区域将被填充,以表示包含生成结果的最终张量。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - 该算子不区分数据类型,直接操作字符数据。 **共享存储版本:** .. c:function:: int skipgram_s(StringPack *sentence, StringPack *words, int ngram_size, int max_skip_size, int include_all_ngrams, StringPack **grams, int *grams_word_count, int *stack, char *blank, char *output_tensor, int *offset, int *len, int *shape, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 31-33 #include #include "skipgram.h" // 假设头文件名 typedef struct StringPack { long long len; char *data; } StringPack; int main(int argc, char* argv[]) { // 假设输入和工作空间已在DDR中分配 StringPack* sentence = (StringPack*)0xA0000000; StringPack* words = (StringPack*)0xA0010000; StringPack** grams = (StringPack**)0xA0020000; int* grams_word_count = (int*)0xA0030000; int* stack = (int*)0xA0040000; char* output_tensor = (char*)0xB0000000; int* offset = (int*)0xB0010000; int* len = (int*)0xB0020000; int* shape = (int*)0xB0030000; char blank_char = ' '; // 填充sentence内容 sentence->data = "mindspore signal processing library"; sentence->len = 33; int ngram_size = 2; int max_skip_size = 1; int include_all_ngrams = 1; int core_mask = 0xff; skipgram_s(sentence, words, ngram_size, max_skip_size, include_all_ngrams, grams, grams_word_count, stack, &blank_char, output_tensor, offset, len, shape, core_mask); return 0; } **私有存储版本:** .. c:function:: int skipgram_p(StringPack *sentence, StringPack *words, int ngram_size, int max_skip_size, int include_all_ngrams, StringPack **grams, int *grams_word_count, int *stack, char *blank, char *output_tensor, int *offset, int *len, int *shape) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 30-32 #include #include "skipgram.h" // 假设头文件名 typedef struct StringPack { long long len; char *data; } StringPack; int main(int argc, char* argv[]) { // 假设输入和工作空间已在私有内存中分配 StringPack* sentence = (StringPack*)0x10001000; StringPack* words = (StringPack*)0x10002000; StringPack** grams = (StringPack**)0x10003000; int* grams_word_count = (int*)0x10004000; int* stack = (int*)0x10005000; char* output_tensor = (char*)0x10006000; int* offset = (int*)0x10007000; int* len = (int*)0x10008000; int* shape = (int*)0x10009000; char blank_char = ' '; // 填充sentence内容 sentence->data = "mindspore signal processing library"; sentence->len = 33; int ngram_size = 2; int max_skip_size = 1; int include_all_ngrams = 1; skipgram_p(sentence, words, ngram_size, max_skip_size, include_all_ngrams, grams, grams_word_count, stack, &blank_char, output_tensor, offset, len, shape); return 0; }